package com.tfjybj.itoo.teach.provider.service;

import com.dmsdbj.itoo.tool.base.entity.YearSemesterEntity;
import com.dmsdbj.itoo.tool.base.service.BaseServicePlus;
import com.dmsdbj.itoo.tool.business.ItooResult;
import com.github.pagehelper.PageInfo;
import com.tfjybj.itoo.teach.entity.TrainingProgramsEntity;
import com.tfjybj.itoo.teach.model.TrainingProgramsModel;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * TrainingProgramsService接口
 * trainingPrograms表
 *
 * @author 田成荣
 * @version 2.0.0
 * @since 2.0.0 2018-11-08 19:34:10
 */
public interface TrainingProgramsService extends BaseServicePlus<TrainingProgramsEntity> {

    //region 模板生成：模糊查询

    /**
     * 根据课程_id查询trainingPrograms
     *
     * @param courseId 课程_id
     * @param pageNo   页码
     * @param pageSize 页数
     * @return 查询的trainingPrograms
     * @author 田成荣
     * @since 2.0.0 2018-11-08 19:34:10
     */
    PageInfo<TrainingProgramsEntity> queryByCourseId(String courseId, Integer pageNo, Integer pageSize);
    //endregion

    /* **********************************以下为非模板生成的内容********************************* */

    /**
     * 根据课程类型ID查询课程信息
     *
     * @param courseTypeId 课程类型
     * @return 课程信息实体集合
     * @author 李建帅
     * @since 2.0.0 2018-11-08 19:34:10
     */
    List<TrainingProgramsModel> queryCourseByCourseTypeId(String courseTypeId);

    /**
     * 根据条件模糊分页查询培养计划--培养计划专用
     *
     * @param academyId    学院ID
     * @param professionId 专业ID
     * @param grade        年级
     * @param pageNo       页码
     * @param pageSize     每页条数
     * @return 培养计划实体集合
     * @author 李建帅
     * @since 2.0.0 2018-11-16 10:11:53
     */
    PageInfo<TrainingProgramsModel> queryTrainingProgramByProIdListAndGradList(String academyId, String professionId, String grade, Integer pageNo, Integer pageSize);

    /**
     * 根据课程ID查询专业id，专业名称
     *
     * @param courseId 课程id
     * @return 课程信息实体
     * @author 李建帅
     * @since 2.0.0 2018-11-10 21:34:17
     */
    List<TrainingProgramsModel> queryProfessionByCourseId(String courseId);

    /**
     * 根据条件模糊分页查询培养计划
     *
     * @param strLike  模糊条件（课程名称）
     * @param pageNo   页码
     * @param pageSize 每页条数
     * @return 培养计划实体集合
     * @author 李建帅
     * @since 2.0.0 2018-11-11 16:27:44
     */
    PageInfo<TrainingProgramsModel> queryTrainingProgramListPageInfo(String strLike, Integer pageNo, Integer pageSize);

    /**
     * 分页查询所有TrainingPrograms
     *
     * @param pageNo   页码
     * @param pageSize 每页条数
     * @author 李建帅
     * @since 2.0.0 2018-11-12 14:52:50
     */
    PageInfo<TrainingProgramsModel> queryAllTrainingProgramsPageInfo(Integer pageNo, Integer pageSize);


    /**
     * 查询所有年级
     *
     * @return 培养计划实体-年级集合
     * @author 李建帅
     * @since 2.0.0 2018/11/13 19:34
     */
    List<YearSemesterEntity> queryAllGrade();

    /**
     * 根据课程ID、专业ID、学期学年ID查询培养计划
     *
     * @param courseId     课程ID
     * @param professionId 专业ID
     * @param semesterId   学年学期ID
     * @return 培养计划实体集合
     * @author 李建帅
     * @since 2.0.0 2018/11/13 20:14
     */
    List<TrainingProgramsModel> queryTpByCoPrSeId(String courseId, String professionId, String semesterId);

    /**
     * 根据培养计划ID查询培养计划详情
     *
     * @param idList 培养计划ID
     * @return 培养计划实体集合
     * @author 李建帅
     * @since 2.0.0 2018-11-15 17:17:03
     */
    List<TrainingProgramsModel> queryTrainingProgramsById(List<String> idList);

    /**
     * 下载培养计划模板，批量导入使用
     *
     * @param response 响应
     * @return 下载模板是否成功
     * @author 李建帅
     * @since 2.0.0 2018-11-15 08:53:53
     */
    boolean downLoadTemplate(HttpServletResponse response);

    /**
     * 批量导入
     *
     * @param
     * @return
     * @author 李建帅
     * @since 2.0.0 2018/11/15 14:33
     */
    ItooResult importTemplate(MultipartFile multipartFile, HttpServletRequest request, HttpServletResponse response);

    /**
     * 根据学年学期ID和专业ID查询课程信息
     *
     * @param semesterId   学年学期ID
     * @param professionId 专业ID
     * @return 课程信息
     * @author 李建帅
     * @since 2.0.0 2018/11/17 9:09
     */
    List<TrainingProgramsModel> queryCourseBySemProId(String semesterId, String professionId);

    /**
     * 根据学年学期ID和专业ID，年级（课程类型为专选课已写死）查询专选课课程ID集合--选课使用
     *
     * @param professionId 专业ID
     * @param grade        年级
     * @return 公选课课程ID集合
     * @author 李建帅
     * @since 2.0.0 2018/11/17 19:18
     */
    List<String> queryCourseIdBySemProId(String professionId, String grade);

    /**
     * 根据培养计划ID导出培养计划
     *
     * @param response response
     * @param idList   培养计划Id
     * @return 导出的结果
     * @author 李建帅
     * @since 2.0.0 2018-11-18 09:09:23
     */
    ItooResult exportByTpId(HttpServletResponse response, List<String> idList);

    /**
     * 根据条件导出培养计划
     *
     * @param response response
     * @param strLike  搜索条件
     * @return 导出的结果
     * @author 李建帅
     * @since 2.0.0 2018-11-18 09:09:23
     */
    ItooResult exportByStrLike(HttpServletResponse response, String academyId, String professionId, String grade, String strLike);

    /**
     * 根据学年学期ID、专业ID、课程ID、年级查询培养计划是否已存在
     *
     * @param semesterId   学年学期ID
     * @param professionId 专业ID
     * @param courseId     课程ID
     * @param grade        年级
     * @return 培养计划ID
     * @author 李建帅
     * @since 2.0.0 2018/11/17 19:19
     */
    String findIdIsExist(String semesterId, String professionId, String courseId, String grade);

    /**
     * 导出错误数据
     *
     * @param response 响应
     * @param errorListId 为成功导入的分组id
     * @return 课程信息model
     * @author 李建帅
     * @since 2018-12-2 08:11:58
     */
    boolean downErrorList(String errorListId, HttpServletResponse response);

    /**
     * 无参查询当前学年的课程ID信息
     *
     * @return 当前学年的课程ID信息
     * @author 杨江涛
     * @since 2.0.0 2018-11-24 19:10:41
     */
    List<TrainingProgramsEntity> findCourseId();

    /**
     * 无参查询当前学年的课程ID信息
     *
     * @param  professionId 专业ID
     * @return 当前学年的课程ID信息
     * @author 杨江涛
     * @since 2.0.0 2018-11-25 11:08:42
     */
    List<TrainingProgramsModel> findByProfessionId(String professionId);

    /**
     * 根据专业id查询当前学年课程(与course表联表查询)
     *
     * @param professionId 专业id
     * @return 当前学年课程信息
     * @author 杨江涛
     * @since 2.0.0 2018-12-4 14:41:59
     */
    List<TrainingProgramsModel> findCourseByProfessionId(String professionId);
}
